<?php

/**
 * @Author: 刘洪
 * @Date:   2018-11-20 11:41:10
 * @Last Modified by:   user
 * @Last Modified time: 2019-01-07 11:43:18
 */

namespace app\common\remind;


use think\Db;
use think\Log;

/**
 * 业务提醒主类
 */
abstract class RemindMain 
{

	/**
	 * 提醒类型 子类中需要定义 0任务  1生日  2合同  3工单 4客户确认
	 * @var integer
	 */
	protected $remindType=0;

	/**
	 * 发送列表
	 * @var array
	 */
	protected $sendList=['email'=>[],'mobile'=>[]];

	/**
	 * 后台用户列表
	 * @var array
	 */
	protected $admin_users = [];

	/**
	 * 上次执行时间
	 * @var string
	 */
	protected $lastSendTime=null;

	/**
	 * 周期
	 * @var integer
	 */
	protected $period=5;

	/**
	 * 今天是否第一次发送
	 */
	protected $is_first=false;


	/**
	 * 构造函数
	 */
	function __construct()
	{

	}

	/**
	 * 通过类型获取提醒列表
	 * 
	 * @return array 	提醒列表
	 */
	protected function init()
	{
		$list=[];//列表 [trigger,send_type,receives,send_connect]
		$result=Db::name('sms_task')->where('type='.$this->remindType." and status=1")->select();
		//处理数据 将发送内容  和 接收人里的内容组成数组
		foreach ($result as $arr) {
			
			$it['trigger']		=	$this->filterNull(explode(',',$arr['trigger']));//触发条件
			if(count($it['trigger'])==1){
				$it['trigger']=intval($it['trigger'][0]);
			}
			$it['send_type']	=	$arr['send_type'];//发送方式
			$it['receives']		=	array_filter(explode(',',$arr['receives_no']));//接收人
			$it['send_connect']	=	$this->filterNull(explode(',',$arr['send_connect_no']));//发送内容

			$this->lastSendTime=empty($this->lastSendTime)?$arr['last_send_time']:$this->lastSendTime;
			$list[]	=	$it;		
		}

		//更新上次执行时间
		Db::name('sms_task')->where('type='.$this->remindType)->update(['last_send_time'=>time()]);
		
		//计算周期
		if(!empty($this->lastSendTime)){

			$this->period=(int)((time()-$this->lastSendTime)/3600);//小时为单位
			//上次发送时间 与现在不在同一天  说明是当天第一次发送
			$today 		= 	(integer)date('Ymd',time());
			$lastTime 	=	(integer)date('Ymd',$this->lastSendTime);

			$this->is_first = (bool)($today > $lastTime);

		}else{
			$this->is_first=true;
		}
		Log::write('今日第一次发送：'.$this->is_first.' 发送提醒类型：'.$this->remindType.' 上次发送时间：'.date('Y-m-d H:i:s',$this->lastSendTime)." 本次发送时间：".date('Y-m-d H:i:s',time())." 本次发送周期：".$this->period);
		//获取后台用户列表
		$this->admin_users=$this->getAdminUserList();
		
		return $list;
	}


	/**
	 * 过滤数组中空元素 
	 * @param  array $arr 原始数组
	 * @return array      新数组
	 */
	function filterNull($arr){
		$v=[];
		foreach ($arr as $key => $value) {
			if($value!=""){
				$v[]=$value;
			}
		}
		return $v;
	}

	/**
	 * 获取后台用户列表
	 * @return array 用户列表
	 */
	public function getAdminUserList()
	{
		return Db::name('user')->where('user_type=1 and user_status=1')->select();
	}


	/**
	 * 发送信息方法
	 * @return 无
	 */
	protected function send($type=""){

		//$this->sendList[email=>[$email=>[]],mobile=>[$mobile=>[]]]
		/*$this->sendList=[
			'email'=>[
				'00@.com'=>'内容'，
			],
			'mobile'=>[
				'188888888'=>'内容'
			]
		];*/

		//dump($this->sendList);
		//邮箱发送
		Log::write('\n邮箱发送开始');
		
		foreach ($this->sendList['email'] as $email=>$connect) {

			$title="卓远OA办公系统业务提醒邮件";
			$connects="<div>想了解更多详情，请登录<a href='http://oa.300c.cn/admin'>卓远OA后台办公系统</a>查看！</div>".$connect;
			$res=cmf_send_email($email,$title,$connects);
			Log::write('==============================================================');
			Log::write("发送结果：".$res['message']);
			Log::write("邮箱：".$email."  内容：".$connects);
			sleep(3);
		}
		
		//短信发送
		Log::write('\n短信发送开始');
		foreach ($this->sendList['mobile'] as $mobile => $connect) {
			//dump($mobile.$connect);
			$sms_ID="SMS_151546559";
			//$connect=["type"=>$type,"title"=>$connect];
			$res=sms_send($mobile,'{"type":"'.$type.'","title":"'.$connect.'"}',$sms_ID);
			Log::write('==============================================================');
			Log::write('{"type":"'.$type.'","title","'.$connect.'"}');
			Log::write("发送结果：".($res)?json_decode($res):false);
			Log::write("手机：".$mobile);
			sleep(3);
		}
	}


	/**
	 * 子类必须实现的重组数据方法
	 * @return 无
	 */
	abstract protected function regroupData();

	/**
	 * 格式化发送列表
	 * 为$this->sendList赋值
	 * @param  array $data 格式原始数据
	 * @param  array $arr  需要提醒的项reminMain类初始化方法提供
	 * @return 无
	 */
	abstract protected function formatSendList($data,$arr);


}